package com.cskaoyan.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.springframework.stereotype.Component;

/**
 * @author stone
 * @date 2022/08/03 15:10
 */
@Component
public class CustomAspect {

    public void method1() {
        System.out.println("hello");
    }

    public void method2() {
        System.out.println("world");
    }

    // Around通知对应的方法 返回值 为 Object → MethodInterceptor的invoke(MethodInvocation)方法
    // 里面要有委托类方法的执行 → 需要一个对象 → 该对象执行某个方法 → 执行委托类的方法
    public Object method3(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("around的前半部分");
        Object proceed = proceedingJoinPoint.proceed(); //执行委托类方法 → 类似于methodInvocation.proceed、method.invoke
        System.out.println("around的后半部分");

        return proceed;
    }

    //afterReturning通知 → 能够获得委托类方法的返回结果
    public void method4(Object result) {
        System.out.println("afterReturning:" + result);
    }

    //afterThrowing通知 → 委托类方法抛出异常的时候会执行，并且呢可以获得委托类方法抛出的异常
    public void method5(Exception exception) {//Throwable也可以
        System.out.println("afterThrowing:" + exception.getMessage());
    }
}
